package longestDiverseString

import (
	"sort"
)

/**
如果字符串中不含有任何 'aaa'，'bbb' 或 'ccc' 这样的字符串作为子串，那么该字符串就是一个「快乐字符串」。
给你三个整数 a，b ，c，请你返回 任意一个 满足下列全部条件的字符串 s：
1、s 是一个尽可能长的快乐字符串。
2、s 中 最多 有a 个字母 'a'、b个字母 'b'、c 个字母 'c' 。
3、s 中只含有 'a'、'b' 、'c' 三种字母。

*/

// 贪心算法
// 为了满足条件1，必须优先插入剩余字母数最多的字母
func longestDiverseString(a int, b int, c int) string {
	ans := []byte{}
	// 初始化
	cnt := []struct {
		c  int
		ch byte
	}{{a, 'a'}, {b, 'b'}, {c, 'c'}}
	for true {
		// 动态维护剩余字母数的大小关系
		//按照剩余字母数量由大到小排序
		sort.Slice(cnt, func(i, j int) bool {
			return cnt[i].c > cnt[j].c
		})
		hasNext := false
		// 从第一个字母开始插入
		for index, str := range cnt {
			// 没有剩的了，直接跳出
			if str.c < 1 {
				break
			}
			length := len(ans)
			// 判断切片倒数第一个字母和倒数第二个字母是否为当前字母，若是，则不满足条件2，插下一个字母了
			if length >= 2 && ans[length-2] == str.ch && ans[length-1] == str.ch {
				continue
			}
			// 可以插入，当前字母数量-1
			ans = append(ans, str.ch)
			hasNext = true
			cnt[index].c--
			break
		}

		// 判断还能不能插
		if !hasNext {
			break
		}
	}
	return string(ans)
}
